package ui.activity.login;

import android.content.Intent;
import android.os.Build;
import android.os.Bundle;
import android.os.StrictMode;
import android.support.annotation.Nullable;
import android.util.Log;
import android.widget.Button;
import android.widget.TextView;

import com.facebook.cache.disk.DiskCacheConfig;
import com.facebook.common.internal.Supplier;
import com.facebook.common.util.ByteConstants;
import com.facebook.drawee.backends.pipeline.Fresco;
import com.facebook.imagepipeline.backends.okhttp.OkHttpImagePipelineConfigFactory;
import com.facebook.imagepipeline.cache.MemoryCacheParams;
import com.facebook.imagepipeline.core.ImagePipelineConfig;
import com.jakewharton.rxbinding.view.RxView;
import com.kf5.sdk.system.init.KF5SDKInitializer;
import com.kf5.sdk.system.utils.SPUtils;
import com.mob.MobSDK;
import com.msd.ocr.idcard.LibraryInitOCR;
import com.squareup.okhttp.OkHttpClient;
//import com.tencent.bugly.crashreport.CrashReport;
import com.umeng.commonsdk.UMConfigure;
import com.umeng.message.IUmengRegisterCallback;
import com.umeng.message.PushAgent;

import net.ck.hzq.R;
import net.ck.hzq.TobuyApplication;

import java.io.File;
import java.util.concurrent.TimeUnit;

import javax.inject.Inject;

import Utils.SharedPrefStore;
import base.BaseAct;
import butterknife.BindView;
import coom.Constants;
import dialog.BaseDialog;
import dialog.YinsiDialog;
import event.NetErrorEvent;
import ui.activity.login.biz.LoginBiz;
import ui.activity.login.component.DaggerLoginComponent;
import ui.activity.login.contract.LoginContract;
import ui.activity.login.module.LoginModule;
import ui.activity.login.presenter.LoginPresenter;
import ui.activity.mine.YinsiAct;
import util.StringUtils;
import util.SysUtils;
import widget.ClearEditText;

/**
 * 新改登录注册
 */
public class LoginAct extends BaseAct implements LoginContract.View {


    @Inject
    LoginPresenter presenter;
    @Inject
    LoginBiz biz;
    @BindView(R.id.edit_login_account)
    ClearEditText account;
    @BindView(R.id.edit_login_password)
    ClearEditText password;
    @BindView(R.id.but_dologin)
    Button login;
    @BindView(R.id.txt_register_account)
    TextView register;
    @BindView(R.id.txt_forget_password)
    TextView forget;

    public static final int MAX_HEAP_SIZE = (int) Runtime.getRuntime().maxMemory();//分配的可用内存
    public static final int MAX_MEMORY_CACHE_SIZE = MAX_HEAP_SIZE / 4;//使用的缓存数量

    public static final int MAX_SMALL_DISK_VERYLOW_CACHE_SIZE = 5 * ByteConstants.MB;//小图极低磁盘空间缓存的最大值（特性：可将大量的小图放到额外放在另一个磁盘空间防止大图占用磁盘空间而删除了大量的小图）
    public static final int MAX_SMALL_DISK_LOW_CACHE_SIZE = 10 * ByteConstants.MB;//小图低磁盘空间缓存的最大值（特性：可将大量的小图放到额外放在另一个磁盘空间防止大图占用磁盘空间而删除了大量的小图）
    public static final int MAX_SMALL_DISK_CACHE_SIZE = 20 * ByteConstants.MB;//小图磁盘缓存的最大值（特性：可将大量的小图放到额外放在另一个磁盘空间防止大图占用磁盘空间而删除了大量的小图）

    public static final int MAX_DISK_CACHE_VERYLOW_SIZE = 10 * ByteConstants.MB;//默认图极低磁盘空间缓存的最大值
    public static final int MAX_DISK_CACHE_LOW_SIZE = 30 * ByteConstants.MB;//默认图低磁盘空间缓存的最大值
    public static final int MAX_DISK_CACHE_SIZE = 50 * ByteConstants.MB;//默认图磁盘缓存的最大值


    public static final String IMAGE_PIPELINE_SMALL_CACHE_DIR = "tobuyapplicationsmall_cache";//小图所放路径的文件夹名
    public static final String IMAGE_PIPELINE_CACHE_DIR = "tobuyapplication_cache";//默认图所放路径的文件夹名

    public static String imgPath;

    @Override
    protected void setRoot() {
//        setTitleBar(R.color.colorBlue);
        setContentView(R.layout.activity_login);
    }

    @Override
    protected void setup() {
        DaggerLoginComponent.builder().loginModule(new LoginModule(this)).build().inject(this);
//        setToolBar(getResources().getString(R.string.lang_day_profit), "");
        presenter.setBiz(biz);
    }


    @Override
    protected void init(@Nullable Bundle savedInstanceState) {
        Constants.CustomerOline = true;
        SPUtils.getInstance(LoginAct.this).saveAppID(Constants.KF5SERCET);
        SPUtils.saveHelpAddress(Constants.KF5URL);
        // 恢复登录账号
        SharedPrefStore store = new SharedPrefStore();
        String savedAccount = store.getString("login_account", "");
        String savedPassword = store.getString("login_password", "");
        String auth = SPUtils.getAuth();
        if(auth.length()==0){
            YinsiDialog dialog = new YinsiDialog();
            dialog.setConfirmListener(new BaseDialog.OnConfirmListener3() {
                @Override
                public void onConfirm() {
                    dialog.dismiss();
                    SPUtils.saveAuth();

                    initALl();
                }

                @Override
                public void onConfirmYinsi() {
                    Intent intent = new Intent(LoginAct.this, YinsiAct.class);
                    startActivity(intent);

                }
            });
            dialog.show(getSupportFragmentManager(),"");
        }
        else{
            initALl();
        }

        account.setText(savedAccount);
        if(!StringUtils.isEmpty(savedPassword)){
            password.setText(savedPassword);
        }
        RxView.clicks(login)
                .compose(this.<Void>bindToLifecycle())
                .throttleFirst(500, TimeUnit.MILLISECONDS)
                .subscribe(Void -> presenter.getLoginInfo(account.getText().toString().trim(), password.getText().toString().trim()));
        RxView.clicks(register)
                .compose(this.<Void>bindToLifecycle())
                .throttleFirst(500, TimeUnit.MILLISECONDS)
                .subscribe(Void -> presenter.toRegister());
        RxView.clicks(forget)
                .compose(this.<Void>bindToLifecycle())
                .throttleFirst(500, TimeUnit.MILLISECONDS)
                .subscribe(Void -> presenter.toForget());
    }


    @Override
    public void onNetErrorEvent(NetErrorEvent event) {
        super.onNetErrorEvent(event);
    }

    @Override
    protected void onNetError(NetErrorEvent event) {

    }


    @Override
    protected void onStop() {
        super.onStop();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        biz.onDestory();
    }

    private void initALl(){
        KF5SDKInitializer.init(TobuyApplication.getInstance());

        UMConfigure.init(this, "5dc4d3373fc195aac20005bf", "Umeng", UMConfigure.DEVICE_TYPE_PHONE, "bbe0a38b1cf1186777f99c6bcb4f2fae");

        //获取消息推送代理示例
        PushAgent mPushAgent = PushAgent.getInstance(this);
//注册推送服务，每次调用register方法都会回调该接口
        mPushAgent.setDisplayNotificationNumber(10);
        mPushAgent.setNoDisturbMode(23, 0, 7, 0);
        mPushAgent.setMuteDurationSeconds(1);
        mPushAgent.register(new IUmengRegisterCallback() {
            @Override
            public void onSuccess(String deviceToken) {
                //注册成功会返回deviceToken deviceToken是推送消息的唯一标志
                Log.e("fjs","注册成功：deviceToken：-------->  " + deviceToken);

            }
            @Override
            public void onFailure(String s, String s1) {
                Log.e("fjs","注册失败：-------->  " + "s:" + s + ",s1:" + s1);
            }
        });

        initFresco();
        // 百度 OCR
        // 分享
        MobSDK.init(this);
        //初始化7.0系统拍照访问文件闪退
        if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
            StrictMode.VmPolicy.Builder builder = new StrictMode.VmPolicy.Builder();
            StrictMode.setVmPolicy(builder.build());
        }

        //身份证识别初始化
//        LibraryInitOCR.initOCR(this);
        MobSDK.submitPolicyGrantResult(true);

//        CrashReport.initCrashReport(getApplicationContext(), "efff1ee53d", false);

    }

    private void initFresco() {
        imgPath = SysUtils.getExternalSdCardPath();
        if (imgPath == null) {
            imgPath = getFilesDir().getAbsolutePath();
        }
        //内存配置
        final MemoryCacheParams bitmapCacheParams = new MemoryCacheParams(
                MAX_MEMORY_CACHE_SIZE, // 内存缓存中总图片的最大大小,以字节为单位。
                Integer.MAX_VALUE, // 内存缓存中图片的最大数量。
                MAX_MEMORY_CACHE_SIZE, // 内存缓存中准备清除但尚未被删除的总图片的最大大小,以字节为单位。
                Integer.MAX_VALUE, // 内存缓存中准备清除的总图片的最大数量。
                Integer.MAX_VALUE); // 内存缓存中单个图片的最大大小。

        //修改内存图片缓存数量，空间策略（这个方式有点恶心）
        Supplier<MemoryCacheParams> mSupplierMemoryCacheParams = new Supplier<MemoryCacheParams>() {
            @Override
            public MemoryCacheParams get() {
                return bitmapCacheParams;
            }
        };

        //小图片的磁盘配置
        DiskCacheConfig diskSmallCacheConfig = DiskCacheConfig.newBuilder(LoginAct.this)
                .setBaseDirectoryPath(LoginAct.this.getApplicationContext().getCacheDir())//缓存图片基路径
                .setBaseDirectoryName(IMAGE_PIPELINE_SMALL_CACHE_DIR)//文件夹名
//                .setCacheErrorLogger(cacheErrorLogger)//日志记录器用于日志错误的缓存。
//                .setCacheEventListener(cacheEventListener)//缓存事件侦听器。
//                .setDiskTrimmableRegistry(diskTrimmableRegistry)//类将包含一个注册表的缓存减少磁盘空间的环境。
                .setMaxCacheSize(MAX_SMALL_DISK_CACHE_SIZE)//默认缓存的最大大小。
                .setMaxCacheSizeOnLowDiskSpace(MAX_SMALL_DISK_LOW_CACHE_SIZE)//缓存的最大大小,使用设备时低磁盘空间。
                .setMaxCacheSizeOnVeryLowDiskSpace(MAX_SMALL_DISK_VERYLOW_CACHE_SIZE)//缓存的最大大小,当设备极低磁盘空间
//                .setVersion(version)
                .build();

        //默认图片的磁盘配置
        DiskCacheConfig diskCacheConfig = DiskCacheConfig.newBuilder(LoginAct.this)
                .setBaseDirectoryPath(new File(imgPath))//缓存图片基路径
                .setBaseDirectoryName(IMAGE_PIPELINE_CACHE_DIR)//文件夹名
                .setMaxCacheSize(MAX_DISK_CACHE_SIZE)//默认缓存的最大大小。
                .setMaxCacheSizeOnLowDiskSpace(MAX_DISK_CACHE_LOW_SIZE)//缓存的最大大小,使用设备时低磁盘空间。
                .setMaxCacheSizeOnVeryLowDiskSpace(MAX_DISK_CACHE_VERYLOW_SIZE)//缓存的最大大小,当设备极低磁盘空间
                .build();

        //缓存图片配置
//        ImagePipelineConfig.Builder configBuilder = ImagePipelineConfig.newBuilder(context)
//              .setAnimatedImageFactory(AnimatedImageFactory animatedImageFactory)//图片加载动画
//              .setBitmapMemoryCacheParamsSupplier(mSupplierMemoryCacheParams)//内存缓存配置（一级缓存，已解码的图片）
//              .setCacheKeyFactory(cacheKeyFactory)//缓存Key工厂
//              .setEncodedMemoryCacheParamsSupplier(encodedCacheParamsSupplier)//内存缓存和未解码的内存缓存的配置（二级缓存）
//              .setExecutorSupplier(executorSupplier)//线程池配置
//              .setImageCacheStatsTracker(imageCacheStatsTracker)//统计缓存的命中率
//              .setImageDecoder(ImageDecoder imageDecoder) //图片解码器配置
//              .setIsPrefetchEnabledSupplier(Supplier<Boolean> isPrefetchEnabledSupplier)//图片预览（缩略图，预加载图等）预加载到文件缓存
//              .setMainDiskCacheConfig(diskCacheConfig)//磁盘缓存配置（总，三级缓存）
//              .setMemoryTrimmableRegistry(memoryTrimmableRegistry) //内存用量的缩减,有时我们可能会想缩小内存用量。比如应用中有其他数据需要占用内存，不得不把图片缓存清除或者减小 或者我们想检查看看手机是否已经内存不够了。
//              .setNetworkFetchProducer(networkFetchProducer)//自定的网络层配置：如OkHttp，Volley
//              .setPoolFactory(poolFactory)//线程池工厂配置
//              .setProgressiveJpegConfig(progressiveJpegConfig)//渐进式JPEG图
//              .setRequestListeners(requestListeners)//图片请求监听
//              .setResizeAndRotateEnabledForNetwork(boolean resizeAndRotateEnabledForNetwork)//调整和旋转是否支持网络图片
//              .setSmallImageDiskCacheConfig(diskSmallCacheConfig);//磁盘缓存配置（小图片，可选～三级缓存的小图优化缓存）

        OkHttpClient okHttpClient = new OkHttpClient();
        ImagePipelineConfig config = OkHttpImagePipelineConfigFactory
                .newBuilder(this, okHttpClient)
                .setBitmapMemoryCacheParamsSupplier(mSupplierMemoryCacheParams)
                .setMainDiskCacheConfig(diskCacheConfig)
                .setSmallImageDiskCacheConfig(diskSmallCacheConfig)
                .build();

        Fresco.initialize(this, config);
    }


}

